﻿using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Diagnostics;

namespace CloudStorageLight.Core.Tests
{
    /// <summary>
    /// SpsBlobAdapterTest の概要の説明
    /// </summary>
    [TestClass]
    public class SpsBlobAdapterTest
    {
        public SpsBlobAdapterTest()
        {
            //
            // TODO: コンストラクター ロジックをここに追加します
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///現在のテストの実行についての情報および機能を
        ///提供するテスト コンテキストを取得または設定します。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 追加のテスト属性
        //
        // テストを作成する際には、次の追加属性を使用できます:
        //
        // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 各テストを実行した後に、TestCleanup を使用してコードを実行してください
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void コンストラクタ()
        {
            using (var adapt = CreateAdapter())
            {
            }
        }

        private BlobAdapterBase CreateAdapter()
        {
            var spsUrl = AppUtil.GetAppConfigValue("sps.url");
            var user = AppUtil.GetAppConfigValue("sps.user");
            var pass = AppUtil.GetAppConfigValue("sps.pass");
            return new SpsBlobAdapter("/SPS/", spsUrl, user, pass, "Shared Documents");
        }

        [TestMethod]
        public void アップロード_取得_削除()
        {
            using (var adapt = CreateAdapter())
            {
                var item = new BlobItem(null,"/SPS/UnitTest/Work.txt");
                using (var st = new MemoryStream(new byte[]{32}))
                {
                    adapt.UploadAsync(item, st).Wait();
                }
                using (var st = new MemoryStream())
                {
                    adapt.DownloadAsync(item, st).Wait();
                    Assert.AreEqual(32, st.ToArray()[0]);
                }
                var list = adapt.GetFilesAsync("/SPS/UnitTest/", 100).Result;
                Assert.AreEqual(2, list.Count);

                adapt.DeleteAsync(item).Wait();

                Assert.IsFalse(adapt.ExistsAsync(item.Path).Result);

                list = adapt.GetFilesAsync("/SPS/UnitTest/", 100).Result;
                Assert.AreEqual(1, list.Count);

            }
        }

        [TestMethod]
        public void フォルダ作成・コピー・削除()
        {
            using (var adapt = CreateAdapter())
            {
                var dire = new BlobDirectory(null, "/SPS/UnitTest/Temp/");
                var item = new BlobFile(null, "/SPS/UnitTest/Temp/Work.txt");
                var item2 = new BlobFile(null, "/SPS/UnitTest/Temp/Sub/Work2.txt");
                var item3 = new BlobFile(null, "/SPS/UnitTest/Temp/Work2.txt");
                var dire2 = new BlobDirectory(null, "/SPS/UnitTest/Temp/Sub/");

                try
                {
                    adapt.DeleteAsync(item2);
                    adapt.DeleteAsync(item3);
                    adapt.DeleteAsync(item);
                }
                catch { };
                try
                {
                    adapt.DeleteAsync(dire2);
                    adapt.DeleteAsync(dire);
                }
                catch { };

                adapt.CreateDirectoryAsync(dire).Wait();

                var list = adapt.GetFilesAsync("/SPS/UnitTest/", 100).Result;
                list = adapt.GetFilesAsync("/SPS/UnitTest/Temp/", 100).Result;
                Assert.AreEqual(1, list.Count);

                using (var st = new MemoryStream(new byte[] { 32 }))
                {
                    adapt.UploadAsync(item, st).Wait();
                }
                Assert.IsTrue(adapt.ExistsAsync(item.Path).Result);

                list = adapt.GetFilesAsync("/SPS/UnitTest/Temp/", 100).Result;
                Assert.AreEqual(2, list.Count);

                adapt.CopyAsync("/SPS/UnitTest/Temp/Work2.txt", item).Wait();
                adapt.CopyAsync(item2.Path, item).Wait();

                list = adapt.GetFilesAsync("/SPS/UnitTest/Temp/", 100).Result;
                Assert.AreEqual(4, list.Count);

                try
                {
                    adapt.DeleteAsync(dire);
                    Assert.Fail();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.ToString());
                }

                adapt.DeleteAsync(dire2);
                adapt.DeleteAsync(dire);

                list = adapt.GetFilesAsync("/SPS/UnitTest/", 100).Result;
                Assert.AreEqual(1, list.Count);

            }
        }

    }
}
